package com.etoak.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.etoak.common.core.enums.ResultEnum;
import com.etoak.common.core.vo.ResultVo;
import com.etoak.common.web.properties.ImageProperties;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.stream.Collectors;

/**
 * @描述 用来上传文件图片
 * @author zhaochenhao
 * @since  2024/8/12 21:20
 * @version  1.0
 */
@RestController
@RequestMapping("/upload")
public class UploadController {

    @Autowired
    ImageProperties imageProperties;

    /**
     * @Description 图片上传
     * @param image 图片文件
     * @return ResultVo
     * @throws IOException transferTo
     */
    @PostMapping("/image")
    public ResultVo<String> upload(MultipartFile image) throws IOException {
        // 判断读取的文件是不是空,如果是则返回文件为空
        if (ObjectUtils.isEmpty(image) || image.isEmpty()) {
            return ResultVo.filed(ResultEnum.FILE_NULL_ERROR);
        }
        // 获取文件的类型(后缀)
        String contentType = image.getContentType();

        // 如果这个文件的后缀不符合(不是 jpeg|png ),则返回仅支持这两种类型
        if (!imageProperties.getTypes().contains(contentType)) {
            String message = imageProperties.getTypes().stream().map(x -> x.substring(x.lastIndexOf("/") + 1))
                    .collect(Collectors.joining("、"));
            return ResultVo.filed(ResultEnum.SYSTEM_ERROR.getCode(),"仅支持" + message);
        }
        // 获取上传的文件的名字
        String originalFilename = image.getOriginalFilename();

        // 获取上传的文件的后缀
        String suffix = FileUtil.getSuffix(originalFilename);

        // 设置一个随机的名字(IdUtil.simpleUUID()) + . (StrUtil.DOT) + 文件的后缀
        String filename = IdUtil.simpleUUID() + StrUtil.DOT + suffix;

        //设置文件存储的目录,如果这个目录不存在的话,就创建一个
        File uploadDir = new File(imageProperties.getLocation());
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }

        // 将上传的文件使用随机生成的名字保存在这个目录中
        File deskFile = new File(uploadDir,filename);
        image.transferTo(deskFile);


        String path = imageProperties.getPrefix().endsWith("/") ?
                imageProperties.getPrefix() + filename :
                imageProperties.getPrefix() + "/" + filename;
        return  ResultVo.sussess(path);
    }
}
